package org.qqcui.designpattern.principles.lsp;

/**
 * 里氏替换原则示例二，通过抽象出更加基础的类，通过子类组合的方式来进行方法的调用
 *
 * @author cuiqingqiang
 * @version 1.0
 * @date 2020-10-13 23:02
 **/
public class LisKov2 {
	public static void main(String[] args) {
		A1 a1 = new A1();
		System.out.println("11-3=" + a1.fun1(11, 3));

		B1 b1 = new B1();
		System.out.println("11+3=" + b1.fun1(11, 3));
		System.out.println("11+3+9=" + b1.fun2(11, 3));
		System.out.println("11-2=" + b1.fun3(11, 2));
	}
}

/**
 * 创建一个更加基础的基类
 * 将更加基础的方法和成员写到基类中
 */
class Base {

}

class A1 extends Base {
	/**
	 * 计算两个数的差
	 * @param a 被减数
	 * @param b 减数
	 * @return 两个数的差
	 */
	public int fun1(int a, int b) {
		return a - b;
	}
}

class B1 extends Base {
	/**、
	 * B1需要使用到A1的方法时，使用组合关系
	 */
	private A1 a1 = new A1();

	/**
	 * 这里无意识重写了A1类的方法，计算逻辑修改为两数之和
	 * @param a
	 * @param b
	 * @return
	 */
	public int fun1(int a, int b) {
		return a + b;
	}

	public int fun2(int a, int b) {
		return fun1(a, b) + 9;
	}

	/**
	 * 如果仍旧想使用A1类的方法，可以使用组合方式调用A1的方法
	 * @param a
	 * @param b
	 * @return
	 */
	public int fun3(int a, int b) {
		return a1.fun1(a, b);
	}
}